#ifndef __FILE_SCANNER_H__
#define __FILE_SCANNER_H__

#include <dirent.h>  // 文件相关属性
#include <string.h>  // 因为要使用 strcmp 方法
#include <map>
#include <string>
#include <vector>
#include "Defines.h"

// 该类用于扫描指定目录下的文件
class FileScanner {
   private:
    std::string _rootPath;                       // 扫描文件根目录
    std::vector<dirent> _fileAttrs;              // 保存文件扫描结果，即对应的文件属性（vector 可以理解成是自动扩张的数组，让文件按某种顺序排列）
    std::map<std::string, dirent> _fileAttrMap;  // 文件扫描结果的字典，实际上是_fileAttrs的副本（map 存的是键值对，方便用于查询）

   private:
    /**
     * @brief       通过索引下标获取文件属性
     *
     * @param       index           要获取的文件属性的下标索引值
     * @return      dirent*         获取成功返回指向索引对应的文件属性指针，否则返回 NULL
     * @note        仅供内部使用，避免一些无法预测的后果
     * @see         在公有接口 _getFileNameByIndex 和 _getFileTypeByIndex 被调用
     */
    dirent* _getDirentByIndex(const int index);

   public:
    /**
     * @brief       文件扫描器构造方法
     *
     * @param       directoryPath   扫描文件根目录的绝对路径
     */
    FileScanner(std::string directoryPath);
    ~FileScanner();

    /**
     * @brief       扫描文件
     *
     * @return      true            扫描成功
     * @return      false           扫描失败
     */
    bool _scan();

    /**
     * @brief       把扫描结果分类，目录在前，文件在后
     *
     * @return      true            分类成功
     * @return      false           分类失败
     * @note        如果想要对目录、文件进一步排序，比如按名称排序，可后续进行拓展
     */
    bool _sortFileAttr();

    /**
     * @brief       通过索引下标获取文件名称
     *
     * @param       index           文件的下标索引值
     * @return      std::string     获取成功返回文件名称，否则返回空字符串""
     */
    std::string _getFileNameByIndex(const int index);

    /**
     * @brief       通过索引下标获取文件类型
     *
     * @param       index           文件的下标索引值
     * @return      unsigned char   获取成功返回文件类型，否则失败返回0
     */
    unsigned char _getFileTypeByIndex(const int index);

    /**
     * @brief       通过文件名称获取文件类型
     *
     * @param       fileName        文件的名称
     * @return      unsigned char   获取成功返回文件类型，否则失败返回0
     */
    unsigned char _getFileTypeByName(std::string fileName);

    /**
     * @brief       获取文件扫描结果的长度
     *
     * @return      int 文件扫描结果的长度
     */
    int _getFileAttrsLength();
};

#endif  // !__FILE_SCANNER_H__
